package com.mind.core.util;

import java.lang.management.CompilationMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import java.util.List;

public class ServerStatusUtil {

	public static void systemInfo() {
		System.out
				.println("=======================通过java来获取相关系统状态============================ ");
		System.out.println("虚拟机中的内存总量 " + Runtime.getRuntime().totalMemory()
				/ 1024 / 1024 + "MB");
		System.out.println("虚拟机中的空闲内存量 " + Runtime.getRuntime().freeMemory()
				/ 1024 / 1024 + "MB");
		System.out.println("虚拟机试图使用的最大内存量 " + Runtime.getRuntime().maxMemory()
				/ 1024 / 1024 + "MB");

		System.out
				.println("=======================操作系统信息============================ ");
		OperatingSystemMXBean osm = (OperatingSystemMXBean) ManagementFactory
				.getOperatingSystemMXBean();
//		System.out.println("系统空闲交换内存：" + osm.getFreeSwapSpaceSize() / 1024
//				/ 1024 + "MB");
//		System.out.println("系统物理内存总计：" + osm.getTotalPhysicalMemorySize()
//				/ 1024 / 1024 + "MB");
//		System.out.println("系统物理可用内存总计：" + osm.getFreePhysicalMemorySize()
//				/ 1024 / 1024 + "MB");
		// 获取操作系统相关信息
		System.out.println("操作系统: " + System.getProperty("os.name"));
		System.out.println("系统版本：" + osm.getVersion());
		System.out.println("虚拟机可以使用的处理器数目 :" + osm.getAvailableProcessors());
		// 获取整个虚拟机内存使用情况
		System.out
				.println("=======================MemoryMXBean============================ ");
		MemoryMXBean mm = (MemoryMXBean) ManagementFactory.getMemoryMXBean();
		System.out.println("用于对象分配的堆的当前内存使用量： " + mm.getHeapMemoryUsage());
		System.out.println("虚拟机使用的非堆内存的当前内存使用量： " + mm.getNonHeapMemoryUsage());
		// 获取各个线程的各种状态，CPU 占用情况，以及整个系统中的线程状况
		System.out
				.println("=======================ThreadMXBean============================ ");
		ThreadMXBean tm = (ThreadMXBean) ManagementFactory.getThreadMXBean();
		System.out.println("活动线程的当前数目，包括守护线程和非守护线程： " + tm.getThreadCount());
		System.out.println("自从 Java 虚拟机启动或峰值重置以来峰值活动线程计数： "
				+ tm.getPeakThreadCount());
		System.out.println("当前线程的总 CPU 时间（以毫微秒为单位）： "
				+ tm.getCurrentThreadCpuTime());
		System.out.println("活动守护线程的当前数目： " + tm.getDaemonThreadCount());
		System.out.println("前线程在用户模式中执行的 CPU 时间： "
				+ tm.getCurrentThreadUserTime());

		// 当前编译器情况
		System.out
				.println("=======================CompilationMXBean============================ ");
		CompilationMXBean gm = (CompilationMXBean) ManagementFactory
				.getCompilationMXBean();
		System.out.println("即时 (JIT) 编译器的名称：" + gm.getName());
		System.out.println("在编译上花费的累积耗费时间的近似值（以毫秒为单位）： "
				+ gm.getTotalCompilationTime());

		// 获取多个内存池的使用情况
		System.out
				.println("=======================MemoryPoolMXBean============================ ");
		List<MemoryPoolMXBean> mpmList = ManagementFactory
				.getMemoryPoolMXBeans();
		for (MemoryPoolMXBean mpm : mpmList) {
			System.out.println("此内存池的名称:" + mpm.getName());
			System.out.println("虚拟机启动以来或自峰值重置以来此内存池的峰值内存使用量："
					+ mpm.getPeakUsage());
			System.out.println("此内存池的内存使用量的估计数： " + mpm.getUsage());
			System.out.println("管理此内存池的内存管理器的名称： "
					+ StringUtils.join(mpm.getMemoryManagerNames(), ","));
		}
		// 获取GC的次数以及花费时间之类的信息
		System.out
				.println("=======================MemoryPoolMXBean============================ ");
		List<GarbageCollectorMXBean> gcmList = ManagementFactory
				.getGarbageCollectorMXBeans();
		for (GarbageCollectorMXBean gcm : gcmList) {
			System.out.println("gc名称 " + gcm.getName());
			System.out.println("内存管理器的名称： "
					+ StringUtils.join(gcm.getMemoryPoolNames(), ","));
			System.out.println("已发生的回收的总次数： " + gcm.getCollectionCount());
			System.out.println("近似的累积回收时间（以毫秒为单位）： " + gcm.getCollectionTime());
		}
		// 获取运行时信息
		System.out
				.println("=======================RuntimeMXBean============================ ");
		RuntimeMXBean rmb = (RuntimeMXBean) ManagementFactory
				.getRuntimeMXBean();
		// System.out.println("系统类加载器用于搜索类文件的 Java 类路径： " + rmb.getClassPath());
		// System.out.println("Java 库路径：" + rmb.getLibraryPath());
		System.out.println("Java 虚拟机实现版本 " + rmb.getVmVersion());

	}

}
